<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Reactive SQL Clients</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/reactive-sql-clients" />
  <meta property="og:title" content="Quarkus - Reactive SQL Clients" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/reactive-sql-clients">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Reactive SQL Clients</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#installing">Installing</a>
<ul class="sectlevel2">
<li><a href="#reactive-postgresql-client-extension">Reactive PostgreSQL Client extension</a></li>
<li><a href="#json-binding">JSON Binding</a></li>
</ul>
</li>
<li><a href="#configuring">Configuring</a></li>
<li><a href="#database-schema-and-seed-data">Database schema and seed data</a></li>
<li><a href="#using">Using</a>
<ul class="sectlevel2">
<li><a href="#query-results-traversal">Query results traversal</a></li>
<li><a href="#prepared-queries">Prepared queries</a></li>
<li><a href="#result-metadata">Result metadata</a></li>
</ul>
</li>
<li><a href="#database-clients-details">Database Clients details</a></li>
<li><a href="#transactions">Transactions</a></li>
<li><a href="#configuration-reference">Configuration Reference</a>
<ul class="sectlevel2">
<li><a href="#common-datasource">Common Datasource</a></li>
<li><a href="#reactive-datasource">Reactive Datasource</a></li>
<li><a href="#db2">DB2</a></li>
<li><a href="#mariadbmysql">MariaDB/MySQL</a></li>
<li><a href="#postgresql">PostgreSQL</a></li>
</ul>
</li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>The Reactive SQL Clients have a straightforward API focusing on scalability and low-overhead.
Currently, the following database servers are supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>DB2</p>
</li>
<li>
<p>PostgreSQL</p>
</li>
<li>
<p>MariaDB/MySQL</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In this guide, you will learn how to implement a simple CRUD application exposing data stored in <strong>PostgreSQL</strong> over a RESTful API.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Extension and connection pool class names for each client can be found at the bottom of this document.
</td>
</tr>
</table>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
If you are not familiar with the Quarkus Vert.x extension, consider reading the <a href="vertx">Using Eclipse Vert.x</a> guide first.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The application shall manage fruit entities:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public class Fruit {

    public Long id;

    public String name;

    public Fruit() {
    }

    public Fruit(String name) {
        this.name = name;
    }

    public Fruit(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Do you need a ready-to-use PostgreSQL server to try out the examples?</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 postgres:10.5</code></pre>
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="installing"><a class="anchor" href="#installing"></a>Installing</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="reactive-postgresql-client-extension"><a class="anchor" href="#reactive-postgresql-client-extension"></a>Reactive PostgreSQL Client extension</h3>
<div class="paragraph">
<p>First, make sure your project has the <code>quarkus-reactive-pg-client</code> extension enabled.
If you are creating a new project, set the <code>extensions</code> parameter as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">mvn io.quarkus:quarkus-maven-plugin:1.7.0.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=reactive-pg-client-quickstart \
    -Dextensions="reactive-pg-client"
cd reactive-pg-client-quickstart</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you have an already created project, the <code>reactive-pg-client</code> extension can be added to an existing Quarkus project with the <code>add-extension</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw quarkus:add-extension -Dextensions="reactive-pg-client"</code></pre>
</div>
</div>
<div class="paragraph">
<p>Otherwise, you can manually add this to the dependencies section of your <code>pom.xml</code> file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependency&gt;
    &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
    &lt;artifactId&gt;quarkus-reactive-pg-client&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="title">Mutiny</div>
<div class="paragraph">
<p>In this guide, we will use the Mutiny API of the Reactive PostgreSQL Client.
If you&#8217;re not familiar with Mutiny reactive types, read the <a href="getting-started-reactive#mutiny">Getting Started with Reactive guide</a> first.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="json-binding"><a class="anchor" href="#json-binding"></a>JSON Binding</h3>
<div class="paragraph">
<p>We will expose <code>Fruit</code> instances over HTTP in the JSON format.
Consequently, you also need to add the <code>quarkus-resteasy-jsonb</code> extension:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw quarkus:add-extension -Dextensions="resteasy-jsonb"</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you prefer not to use the command line, manually add this to the dependencies section of your <code>pom.xml</code> file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependency&gt;
    &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
    &lt;artifactId&gt;quarkus-resteasy-jsonb&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Of course, this is only a requirement for this guide, not any application using the Reactive PostgreSQL Client.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuring"><a class="anchor" href="#configuring"></a>Configuring</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Reactive PostgreSQL Client can be configured with standard Quarkus datasource properties and a reactive URL:</p>
</div>
<div class="listingblock">
<div class="title">src/main/resources/application.properties</div>
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=quarkus_test
quarkus.datasource.password=quarkus_test
quarkus.datasource.reactive.url=postgresql://localhost:5432/quarkus_test</code></pre>
</div>
</div>
<div class="paragraph">
<p>With that you may create your <code>FruitResource</code> skeleton and <code>@Inject</code> a <code>io.vertx.mutiny.pgclient.PgPool</code> instance:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@Path("fruits")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class FruitResource {

    @Inject
    io.vertx.mutiny.pgclient.PgPool client;
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="database-schema-and-seed-data"><a class="anchor" href="#database-schema-and-seed-data"></a>Database schema and seed data</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Before we implement the REST endpoint and data management code, we need to setup the database schema.
It would also be convenient to have some data inserted upfront.</p>
</div>
<div class="paragraph">
<p>For production we would recommend to use something like the <a href="flyway">Flyway database migration tool</a>.
But for development we can simply drop and create the tables on startup, and then insert a few fruits.</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@Inject
@ConfigProperty(name = "myapp.schema.create", defaultValue = "true") <i class="conum" data-value="1"></i><b>(1)</b>
boolean schemaCreate;

@PostConstruct
void config() {
    if (schemaCreate) {
        initdb();
    }
}

private void initdb() {
    // TODO
}</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
You may override the default value of the <code>myapp.schema.create</code> property in the <code>application.properties</code> file.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Almost ready!
To initialize the DB in development mode, we will use the client simple <code>query</code> method.
It returns a <code>Uni</code> and thus can be composed to execute queries sequentially:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">client.query("DROP TABLE IF EXISTS fruits").execute()
    .flatMap(r -&gt; client.query("CREATE TABLE fruits (id SERIAL PRIMARY KEY, name TEXT NOT NULL)").execute())
    .flatMap(r -&gt; client.query("INSERT INTO fruits (name) VALUES ('Orange')").execute())
    .flatMap(r -&gt; client.query("INSERT INTO fruits (name) VALUES ('Pear')").execute())
    .flatMap(r -&gt; client.query("INSERT INTO fruits (name) VALUES ('Apple')").execute())
    .await().indefinitely();</code></pre>
</div>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
<div class="title">Breaking Change in Quarkus 1.5</div>
<div class="paragraph">
<p>Vert.x 3.9, integrated in Quarkus 1.5, introduces a breaking change regarding the <code>query</code> methods.
To retrieve the result you need to call <code>.execute()</code>.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Wondering why we need block until the latest query is completed?
This code is part of a <code>@PostConstruct</code> method and Quarkus invokes it synchronously.
As a consequence, returning prematurely could lead to serving requests while the database is not ready yet.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>That&#8217;s it!
So far we have seen how to configure a pooled client and execute simple queries.
We are now ready to develop the data management code and implement our RESTful endpoint.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="using"><a class="anchor" href="#using"></a>Using</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="query-results-traversal"><a class="anchor" href="#query-results-traversal"></a>Query results traversal</h3>
<div class="paragraph">
<p>In development mode, the database is set up with a few rows in the <code>fruits</code> table.
To retrieve all the data, we will use the <code>query</code> method again:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">Uni&lt;RowSet&lt;Row&gt;&gt; rowSet = client.query("SELECT id, name FROM fruits ORDER BY name ASC").execute();</code></pre>
</div>
</div>
<div class="paragraph">
<p>When the operation completes, we will get a <code>RowSet</code> that has all the rows buffered in memory.
A <code>RowSet</code> is an <code>java.lang.Iterable&lt;Row&gt;</code> and thus can be converted to a <code>Multi</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">Multi&lt;Fruit&gt; fruits = rowSet
  .onItem().transformToMulti(set -&gt; Multi.createFrom().iterable(set))
  .onItem().transform(Fruit::from);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>Fruit#from</code> method converts a <code>Row</code> instance to a <code>Fruit</code> instance.
It is extracted as a convenience for the implementation of the other data management methods:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/Fruit.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">private static Fruit from(Row row) {
    return new Fruit(row.getLong("id"), row.getString("name"));
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Putting it all together, the <code>Fruit.findAll</code> method looks like:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/Fruit.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public static Multi&lt;Fruit&gt; findAll(PgPool client) {
    return client.query("SELECT id, name FROM fruits ORDER BY name ASC").execute()
            .onItem().transformToMulti(set -&gt; Multi.createFrom().iterable(set))
            .onItem().transform(Fruit::from);
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>And the endpoint to get all fruits from the backend:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@GET
public Multi&lt;Fruit&gt; get() {
    return Fruit.findAll(client);
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Now start Quarkus in <code>dev</code> mode with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw compile quarkus:dev</code></pre>
</div>
</div>
<div class="paragraph">
<p>Lastly, open your browser and navigate to <a href="http://localhost:8080/fruits" class="bare">http://localhost:8080/fruits</a>, you should see:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">[{"id":3,"name":"Apple"},{"id":1,"name":"Orange"},{"id":2,"name":"Pear"}]</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="prepared-queries"><a class="anchor" href="#prepared-queries"></a>Prepared queries</h3>
<div class="paragraph">
<p>The Reactive PostgreSQL Client can also prepare queries and take parameters that are replaced in the SQL statement at execution time:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">client.preparedQuery("SELECT id, name FROM fruits WHERE id = $1").execute(Tuple.of(id))</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
The SQL string can refer to parameters by position, using $1, $2, &#8230;&#8203;etc.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Similar to the simple <code>query</code> method, <code>preparedQuery</code> returns an instance of <code>PreparedQuery&lt;RowSet&lt;Row&gt;&gt;</code>.
Equipped with this tooling, we are able to safely use an <code>id</code> provided by the user to get the details of a particular fruit:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/Fruit.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public static Uni&lt;Fruit&gt; findById(PgPool client, Long id) {
    return client.preparedQuery("SELECT id, name FROM fruits WHERE id = $1").execute(Tuple.of(id)) <i class="conum" data-value="1"></i><b>(1)</b>
            .onItem().transform(RowSet::iterator) <i class="conum" data-value="2"></i><b>(2)</b>
            .onItem().transform(iterator -&gt; iterator.hasNext() ? from(iterator.next()) : null); <i class="conum" data-value="3"></i><b>(3)</b>
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Create a <code>Tuple</code> to hold the prepared query parameters.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Get an <code>Iterator</code> for the <code>RowSet</code> result.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Create a <code>Fruit</code> instance from the <code>Row</code> if an entity was found.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>And in the JAX-RS resource:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@GET
@Path("{id}")
public Uni&lt;Response&gt; getSingle(@PathParam Long id) {
    return Fruit.findById(client, id)
            .onItem().transform(fruit -&gt; fruit != null ? Response.ok(fruit) : Response.status(Status.NOT_FOUND)) <i class="conum" data-value="1"></i><b>(1)</b>
            .onItem().transform(ResponseBuilder::build); <i class="conum" data-value="2"></i><b>(2)</b>
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Prepare a JAX-RS response with  either the <code>Fruit</code> instance if found or the <code>404</code> status code.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Build and send the response.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The same logic applies when saving a <code>Fruit</code>:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/Fruit.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public Uni&lt;Long&gt; save(PgPool client) {
    return client.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING (id)").execute(Tuple.of(name))
            .onItem().transform(pgRowSet -&gt; pgRowSet.iterator().next().getLong("id"));
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>And in the web resource we handle the <code>POST</code> request:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@POST
public Uni&lt;Response&gt; create(Fruit fruit) {
    return fruit.save(client)
            .onItem().transform(id -&gt; URI.create("/fruits/" + id))
            .onItem().transform(uri -&gt; Response.created(uri).build());
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="result-metadata"><a class="anchor" href="#result-metadata"></a>Result metadata</h3>
<div class="paragraph">
<p>A <code>RowSet</code> does not only hold your data in memory, it also gives you some information about the data itself, such as:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>the number of rows affected by the query (inserted/deleted/updated/retrieved depending on the query type),</p>
</li>
<li>
<p>the column names.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Let&#8217;s use this to support removal of fruits in the database:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/Fruit.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public static Uni&lt;Boolean&gt; delete(PgPool client, Long id) {
    return client.preparedQuery("DELETE FROM fruits WHERE id = $1").execute(Tuple.of(id))
            .onItem().transform(pgRowSet -&gt; pgRowSet.rowCount() == 1); <i class="conum" data-value="1"></i><b>(1)</b>
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Inspect metadata to determine if a fruit has been actually deleted.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>And to handle the HTTP <code>DELETE</code> method in the web resource:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@DELETE
@Path("{id}")
public Uni&lt;Response&gt; delete(@PathParam Long id) {
    return Fruit.delete(client, id)
            .onItem().transform(deleted -&gt; deleted ? Status.NO_CONTENT : Status.NOT_FOUND)
            .onItem().transform(status -&gt; Response.status(status).build());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>With <code>GET</code>, <code>POST</code> and <code>DELETE</code> methods implemented, we may now create a minimal web page to try the RESTful application out.
We will use <a href="https://jquery.com/">jQuery</a> to simplify interactions with the backend:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="html" class="language-html hljs">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset="utf-8"/&gt;
    &lt;title&gt;Reactive PostgreSQL Client - Quarkus&lt;/title&gt;
    &lt;script src="https://code.jquery.com/jquery-3.3.1.min.js"
            integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"&gt;&lt;/script&gt;
    &lt;script type="application/javascript" src="fruits.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Fruits API Testing&lt;/h1&gt;

&lt;h2&gt;All fruits&lt;/h2&gt;
&lt;div id="all-fruits"&gt;&lt;/div&gt;

&lt;h2&gt;Create Fruit&lt;/h2&gt;
&lt;input id="fruit-name" type="text"&gt;
&lt;button id="create-fruit-button" type="button"&gt;Create&lt;/button&gt;
&lt;div id="create-fruit"&gt;&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the Javascript code, we need a function to refresh the list of fruits when:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>the page is loaded, or</p>
</li>
<li>
<p>a fruit is added, or</p>
</li>
<li>
<p>a fruit is deleted.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="javascript" class="language-javascript hljs">function refresh() {
    $.get('/fruits', function (fruits) {
        var list = '';
        (fruits || []).forEach(function (fruit) { <i class="conum" data-value="1"></i><b>(1)</b>
            list = list
                + '&lt;tr&gt;'
                + '&lt;td&gt;' + fruit.id + '&lt;/td&gt;'
                + '&lt;td&gt;' + fruit.name + '&lt;/td&gt;'
                + '&lt;td&gt;&lt;a href="#" onclick="deleteFruit(' + fruit.id + ')"&gt;Delete&lt;/a&gt;&lt;/td&gt;'
                + '&lt;/tr&gt;'
        });
        if (list.length &gt; 0) {
            list = ''
                + '&lt;table&gt;&lt;thead&gt;&lt;th&gt;Id&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/thead&gt;'
                + list
                + '&lt;/table&gt;';
        } else {
            list = "No fruits in database"
        }
        $('#all-fruits').html(list);
    });
}

function deleteFruit(id) {
    $.ajax('/fruits/' + id, {method: 'DELETE'}).then(refresh);
}

$(document).ready(function () {

    $('#create-fruit-button').click(function () {
        var fruitName = $('#fruit-name').val();
        $.post({
            url: '/fruits',
            contentType: 'application/json',
            data: JSON.stringify({name: fruitName})
        }).then(refresh);
    });

    refresh();
});</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The <code>fruits</code> parameter is not defined when the database is empty.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>All done!
Navigate to <a href="http://localhost:8080/fruits.html" class="bare">http://localhost:8080/fruits.html</a> and read/create/delete some fruits.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="database-clients-details"><a class="anchor" href="#database-clients-details"></a>Database Clients details</h2>
<div class="sectionbody">
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 15%;">
<col style="width: 35%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Database</th>
<th class="tableblock halign-left valign-top">Extension name</th>
<th class="tableblock halign-left valign-top">Pool class name</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DB2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>quarkus-reactive-db2-client</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>io.vertx.mutiny.db2client.DB2Pool</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MariaDB/MySQL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>quarkus-reactive-mysql-client</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>io.vertx.mutiny.mysqlclient.MySQLPool</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostgreSQL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>quarkus-reactive-pg-client</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>io.vertx.mutiny.pgclient.PgPool</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="transactions"><a class="anchor" href="#transactions"></a>Transactions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The reactive SQL clients support transactions.
A transaction is started with <code>client.begin()</code> and terminated with either <code>tx.commit()</code> or <code>tx.rollback()</code>.
All these operations are asynchronous:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>client.begin()</code> returns a <code>Uni&lt;Transaction&gt;</code></p>
</li>
<li>
<p><code>client.commit()</code> and <code>client.rollback()</code> return <code>Uni&lt;Void&gt;</code></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Managing transactions in the reactive programming world can be cumbersome.
Instead of writing repetitive and complex (thus error-prone!) code, you can use the <code>io.vertx.mutiny.sqlclient.SqlClientHelper</code>.</p>
</div>
<div class="paragraph">
<p>The following snippet shows how to run 2 insertions in the same transaction:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public static Uni&lt;Void&gt; insertTwoFruits(PgPool client, Fruit fruit1, Fruit fruit2) {
    return SqlClientHelper.inTransactionUni(client, tx -&gt; {
        Uni&lt;RowSet&lt;Row&gt;&gt; insertOne = tx.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING (id)")
                .execute(Tuple.of(fruit1.name));
        Uni&lt;RowSet&lt;Row&gt;&gt; insertTwo = tx.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING (id)")
                .execute(Tuple.of(fruit2.name));

        return insertOne.and(insertTwo)
                // Ignore the results (the two ids)
                .onItem().ignore().andContinueWithNull();
    });
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this example, the transaction is automatically committed on success or rolled back on failure.</p>
</div>
<div class="paragraph">
<p>You can also create dependent actions as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">return SqlClientHelper.inTransactionUni(client, tx -&gt; tx

        .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2) RETURNING (id)")
                .execute(Tuple.of(person.getFirstName(), person.getLastName()))

        .onItem().transformToUni(id -&gt; tx.preparedQuery("INSERT INTO addr (person_id,addrline1) VALUES ($1,$2)")
                .execute(Tuple.of(id.iterator().next().getLong("id"), person.getLastName())))

        .onItem().ignore().andContinueWithNull());</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuration-reference"><a class="anchor" href="#configuration-reference"></a>Configuration Reference</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="common-datasource"><a class="anchor" href="#common-datasource"></a>Common Datasource</h3>
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-datasource_configuration"></a><a href="#quarkus-datasource_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-datasource_quarkus.datasource.db-kind"></a><code><a href="#quarkus-datasource_quarkus.datasource.db-kind">quarkus.datasource.db-kind</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The kind of database we will connect to (e.g. h2, postgresql&#8230;&#8203;).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-datasource_quarkus.datasource.health.enabled"></a><code><a href="#quarkus-datasource_quarkus.datasource.health.enabled">quarkus.datasource.health.enabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether or not an health check is published in case the smallrye-health extension is present.
 This is a global setting and is not specific to a datasource.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-datasource_quarkus.datasource.metrics.enabled"></a><code><a href="#quarkus-datasource_quarkus.datasource.metrics.enabled">quarkus.datasource.metrics.enabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether or not datasource metrics are published in case the smallrye-metrics extension is present.
 This is a global setting and is not specific to a datasource.
 NOTE: This is different from the "jdbc.enable-metrics" property that needs to be set on the JDBC datasource level to enable collection of metrics for that datasource.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.username"></a><code><a href="#quarkus-datasource_quarkus.datasource.username">quarkus.datasource.username</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource username</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.password"></a><code><a href="#quarkus-datasource_quarkus.datasource.password">quarkus.datasource.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource password</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.credentials-provider"></a><code><a href="#quarkus-datasource_quarkus.datasource.credentials-provider">quarkus.datasource.credentials-provider</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The credentials provider name</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.credentials-provider-name"></a><code><a href="#quarkus-datasource_quarkus.datasource.credentials-provider-name">quarkus.datasource.credentials-provider-name</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The credentials provider bean name.
 It is the <code>&amp;#64;Named</code> value of the credentials provider bean. It is used to discriminate if multiple CredentialsProvider beans are available.
 For Vault it is: vault-credentials-provider. Not necessary if there is only one credentials provider available.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.max-size"></a><code><a href="#quarkus-datasource_quarkus.datasource.max-size">quarkus.datasource.max-size</a></code></p>
</div>
<div class="openblock description">
<div class="content">

</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>20</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-datasource_quarkus.datasource.named-data-sources"></a><a href="#quarkus-datasource_quarkus.datasource.named-data-sources">Additional named datasources</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-datasource_quarkus.datasource.-datasource-name-.db-kind"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.db-kind">quarkus.datasource."datasource-name".db-kind</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The kind of database we will connect to (e.g. h2, postgresql&#8230;&#8203;).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.-datasource-name-.username"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.username">quarkus.datasource."datasource-name".username</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource username</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.-datasource-name-.password"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.password">quarkus.datasource."datasource-name".password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource password</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.-datasource-name-.credentials-provider"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.credentials-provider">quarkus.datasource."datasource-name".credentials-provider</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The credentials provider name</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.-datasource-name-.credentials-provider-name"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.credentials-provider-name">quarkus.datasource."datasource-name".credentials-provider-name</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The credentials provider bean name.
 It is the <code>&amp;#64;Named</code> value of the credentials provider bean. It is used to discriminate if multiple CredentialsProvider beans are available.
 For Vault it is: vault-credentials-provider. Not necessary if there is only one credentials provider available.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-datasource_quarkus.datasource.-datasource-name-.max-size"></a><code><a href="#quarkus-datasource_quarkus.datasource.-datasource-name-.max-size">quarkus.datasource."datasource-name".max-size</a></code></p>
</div>
<div class="openblock description">
<div class="content">

</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>20</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="reactive-datasource"><a class="anchor" href="#reactive-datasource"></a>Reactive Datasource</h3>
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-reactive-datasource_configuration"></a><a href="#quarkus-reactive-datasource_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-reactive-datasource_quarkus.datasource.reactive"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive">quarkus.datasource.reactive</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>If we create a Reactive datasource for this datasource.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.cache-prepared-statements"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.cache-prepared-statements">quarkus.datasource.reactive.cache-prepared-statements</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether prepared statements should be cached on the client side.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.url"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.url">quarkus.datasource.reactive.url</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource URL.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.max-size"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.max-size">quarkus.datasource.reactive.max-size</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The datasource pool maximum size.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-all"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-all">quarkus.datasource.reactive.trust-all</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether all server certificates should be trusted.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pem"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pem">quarkus.datasource.reactive.trust-certificate-pem</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>PEM Trust config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pem.certs"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pem.certs">quarkus.datasource.reactive.trust-certificate-pem.certs</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Comma-separated list of the trust certificate files (Pem format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">list of string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks">quarkus.datasource.reactive.trust-certificate-jks</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>JKS config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks.path"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks.path">quarkus.datasource.reactive.trust-certificate-jks.path</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Path of the key file (JKS format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks.password"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-jks.password">quarkus.datasource.reactive.trust-certificate-jks.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Password of the key file.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx">quarkus.datasource.reactive.trust-certificate-pfx</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>PFX config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx.path"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx.path">quarkus.datasource.reactive.trust-certificate-pfx.path</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Path to the key file (PFX format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx.password"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.trust-certificate-pfx.password">quarkus.datasource.reactive.trust-certificate-pfx.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Password of the key.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem">quarkus.datasource.reactive.key-certificate-pem</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>PEM Key/cert config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem.keys"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem.keys">quarkus.datasource.reactive.key-certificate-pem.keys</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Comma-separated list of the path to the key files (Pem format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">list of string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem.certs"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pem.certs">quarkus.datasource.reactive.key-certificate-pem.certs</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Comma-separated list of the path to the certificate files (Pem format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">list of string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks">quarkus.datasource.reactive.key-certificate-jks</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>JKS config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks.path"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks.path">quarkus.datasource.reactive.key-certificate-jks.path</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Path of the key file (JKS format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks.password"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-jks.password">quarkus.datasource.reactive.key-certificate-jks.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Password of the key file.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx">quarkus.datasource.reactive.key-certificate-pfx</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>PFX config is disabled by default.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx.path"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx.path">quarkus.datasource.reactive.key-certificate-pfx.path</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Path to the key file (PFX format).</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx.password"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.key-certificate-pfx.password">quarkus.datasource.reactive.key-certificate-pfx.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Password of the key.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-datasource_quarkus.datasource.reactive.thread-local"></a><code><a href="#quarkus-reactive-datasource_quarkus.datasource.reactive.thread-local">quarkus.datasource.reactive.thread-local</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Experimental: use one connection pool per thread.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="db2"><a class="anchor" href="#db2"></a>DB2</h3>
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-reactive-db2-client_configuration"></a><a href="#quarkus-reactive-db2-client_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-db2-client_quarkus.datasource.reactive.db2.ssl"></a><code><a href="#quarkus-reactive-db2-client_quarkus.datasource.reactive.db2.ssl">quarkus.datasource.reactive.db2.ssl</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether SSL/TLS is enabled.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="mariadbmysql"><a class="anchor" href="#mariadbmysql"></a>MariaDB/MySQL</h3>
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-reactive-mysql-client_configuration"></a><a href="#quarkus-reactive-mysql-client_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.charset"></a><code><a href="#quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.charset">quarkus.datasource.reactive.mysql.charset</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Charset for connections.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.collation"></a><code><a href="#quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.collation">quarkus.datasource.reactive.mysql.collation</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Collation for connections.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.ssl-mode"></a><code><a href="#quarkus-reactive-mysql-client_quarkus.datasource.reactive.mysql.ssl-mode">quarkus.datasource.reactive.mysql.ssl-mode</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Desired security state of the connection to the server.
 See <a href="https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-mode">MySQL Reference Manual</a>.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>disabled</code>, <code>preferred</code>, <code>required</code>, <code>verify-ca</code>, <code>verify-identity</code></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>disabled</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="postgresql"><a class="anchor" href="#postgresql"></a>PostgreSQL</h3>
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-reactive-pg-client_configuration"></a><a href="#quarkus-reactive-pg-client_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-pg-client_quarkus.datasource.reactive.postgresql.pipelining-limit"></a><code><a href="#quarkus-reactive-pg-client_quarkus.datasource.reactive.postgresql.pipelining-limit">quarkus.datasource.reactive.postgresql.pipelining-limit</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The maximum number of inflight database commands that can be pipelined.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-reactive-pg-client_quarkus.datasource.reactive.postgresql.ssl-mode"></a><code><a href="#quarkus-reactive-pg-client_quarkus.datasource.reactive.postgresql.ssl-mode">quarkus.datasource.reactive.postgresql.ssl-mode</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>SSL operating mode of the client.
 See <a href="https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION">Protection Provided in Different Modes</a>.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>disable</code>, <code>allow</code>, <code>prefer</code>, <code>require</code>, <code>verify-ca</code>, <code>verify-full</code></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>disable</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
